package com.hspedu.polymorphic_.deltail;

/**
 * 多态的前提：两个对象（类）存在继承关系
 * 多态的向上转型
 *
 * 1.本质：父类的引用指向了子类的对象
 * 2.语法：父类类型 引用名 = new 子类类型()
 * 3.特点：编译类型看左边，运行类型看右边
 *        可以调用父类中的所有成员（需要遵守访问权限），
 *        不能调用子类中特有成员；
 *        最终运行效果看子类的具体实现
 *
 */

public class PolyDetail {
    public static void main(String[] args) {
        System.out.println("======向上转型======");
        //向上转型的本质：父类的引用指向了子类的对象
        Animal animal = new Cat();
        Object obj = new Cat();//Animal的父类Object也可以

        //可以调用父类中的所有成员（需要遵守访问权限），
//        animal.show();//show()是父类私有的方法，不能调用

        // 不能调用子类中特有成员；
        //因为在编译阶段，能调用哪些成员，是由编译类型来决定的
//        animal.catchMouse();//不能调用子类的特有的成员

        animal.eat();//最终运行效果看子类的具体实现，即调用方法时，先从子类开始查找方法，然后再找父类
        animal.run();
        animal.sleep();

        System.out.println("=======向下转型=======");
        /**
         * 多态的向下转型
         * 1.语法：子类类型 引用名 = (子类类型)父类引用;//将父类引用强制转换了
         */
        Cat cat = (Cat) animal;//这时cat的百衲衣类型时Cat，运行类型也是Cat

        //2.父类的引用必须指向的是当前目标类型的对象
//        Dog dog = (Dog) animal;//错误，不能将猫类型的对象 强制转换 为狗类型对象
//        ((Dog) animal).cry();

        cat.catchMouse();
    }
}
